home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Inside Mac Games Volume 4 #9
/
IMG 40 Sep 1996.iso
/
More Goodies
/
More for Your Game
/
Doom II
/
DFLE Users Folder
/
DFUSE Tutorials
/
DFTUTOR2.TXT
< prev
next >
Wrap
Text File
|
1996-02-05
|
30KB
|
761 lines
DFUSE Tutorial - Part 2
By: Ben & Pat McBride
July 16, 1995
E-mail us at --- Compuserve: 74454,1421
Internet: 74454.1421@compuserve.com
===========================================================================
What you will learn in Part II: Subsectors, Stairs, Object Altitudes,
Top and Bottom Textures, Introduction to .INF, Lifts, Switches,
Key Doors, Layers, 2 Ways to Test a Level, and Helpful Hints.
============================================================================
Hello! Welcome to the DFUSE Tutorial - Part 2!
*** You DO NOT need ANY Doom experience to use this tutorial! ***
We are assuming that you already have gotten DFUSE to run properly. If you are
having trouble getting DFUSE to work, I suggest you read the README file. We
are also assuming that you know everything from Part 1 of the tutorial.
The way this tutorial works is like this: (***NOTE*** this is different then
the first tutorial!!!) you print out the tutorial, read the tutorial,
load up DFUSE, then try what you learned. From part 2 on, we will no longer
tell you *exactly* what to do, but we'll explain *how* to do things. For
example, in part 1 we would tell you to put a sector in a certain place etc.,
but in this one we will explain to you how to do certain things, and you
can use what you learn in your own level.
Also, when we talk about 'lines' in this tutorial, it means the same thing
as 'walls'. In the DFUSE docs, they are called 'walls', but we like to
call them 'lines'.
If you don't have a printer and would like to be able to view this tutorial
while in DFUSE, I suggest you rename the file df_specs.doc as specs.doc (in
the c:\dark\dfuse\docs dir), and then copy this tutorial to /docs/ and rename
the tutorial df_specs.doc. This will allow you to view the tutorial by
pressing <Alt + F1> in LEVMAP.
OOPS! --- We made an error in our last tutorial. We said that there was no
way to edit vertices, but there is. Vertices can be edited by
pressing enter, and you can change the coordinates to fine tune
their positions. Sorry for the mistake, and thanks to the people
who found this error.
This tutorial comes with an example level, which contains most of the stuff
you'll learn in this tutorial. See the file EXAMPLE1.TXT for more info.
Ok, here we go!
================
Subsectors
================
One of the most important things you'll need to know how to do when making a
level is how to make Subsectors. A subsector is a sector inside of another
sector, like this:
X-------------------X
| 1 | 1 = outside sector
| X-----X | 2 = subsector
| | 2 | |
| | | |
| X-----X |
| | Diagram 2-1
X-------------------X
Now say we wanted to make sector 2 a platform a little bit higher than the
floor that the player could walk on. Here's how to do it: Highlight sector 1,
postion the mouse cursor in the center of sector 1, and push <Ctl + K>.
Push F2 and it will create a 4 sided sector inside of sector 1. The <Ctl +K>
feature is *supposed* to automatically adjoin the lines of sector 2 for you,
but it hardly ever works, so you'll probably have to adjoin the lines your-
self. To do this you have to separate all the vertices (by moving them off of
the other ones), then use <alt + right click> to put them all back together
again, then adjoin the lines by highlighting each line and pushing "A".
Remember, everytime you want to make a sector inside of another sector, you
*have* to use <Ctl + K>.
If all the lines adjoined properly, you should be able to highlight sector 2
seperately, and when you highlight sector 1, sector 2 should also be
highlighted (because the outer lines are part of sector 1). The player can
now walk through sector 2 because the lines are adjoined.
Making the sector a platform is easy: just edit sector 2 and change the floor
altitude ("FAl:") to 8. This will make the floor height of sector 2 "8"
higher than the floor around it (which is 0). If you wanted to change the
texture of the sides of the platform, you would change the outer lines Bottom
texture, because bottom texture is the texture "below the floor".
If you wanted to make the walls of sector 2 solid walls instead of walk
through, you would have used <Alt + K>. This does the same thing as <Ctl + K>
except that it doesn't adjoin the lines, thus making walls. Try it out.
Note that if you used <Alt + K>, sector 2 would not be a highlightable sector.
=============
Stairs
=============
Making stairs is actually quite simple. All you have to do is change the floor
height of each sector, like this:
Each number represents the sector's Floor Altitude (FAl):
_______________
| |___ ___ ___
| 0 | 3 | 6 | 9 | Diagram 2-2
| |___|___|___| etc.....
|_______________|
These stairs would go UP, since each sector is 3 higher than the one before
it. The Extrude function (highlight line and push "E") is *VERY* useful in
making stairs! If you don't know how to use it, learn now.
To make staris go DOWN, all you would have to do is make each sector's floor
altitude lower than the one before it (i.e. 0...-3....-6...-9...etc...).
You don't have to make the stairs 3 high each. Stairs lower than 3 are fine,
but if you make them 4 or more the player will have to jump to get up them.
If you wanted to make a REALLY LONG staircase, figuring out each stair's
height could get tedious. So, DFUSE has some shortcuts that can save you the
time of doing this! They are:
Distribute Floor Altitudes ------------ <Alt + F8>
Distribute Ceiling Altitudes ---------- <Ctl + F8>
Distribute Floor & Ceiling Altitudes --- <F8>
Here's how to use them:
Say you had a sector with floor height 0 and ceiling height 16, and you
wanted to make stairs going up to a sector with floor height 15 and ceiling
height 31. It would look like this:
_______________ ____________
| |___ ___ ___ ___| |
| FAl: 0 | | | | | FAl:15 | Diagram 2-3
| CAl: 16 |___|___|___|___| CAl:31 |
|_______________| |____________|
Sector A Sector B
Instead of figuring out what each stair's floor altitude should be, you would
do this --- Multiselect all the sectors (shift + click), starting with
sector A and ending with the sector B. Now push <F8>, and it distributes
the floor between 0 and 15 and the ceiling between 16 and 31.
It will now look like this:
16 19 22 25 28 31 <- Ceiling Heights
_______________ ____________
| |___ ___ ___ ___| |
| 0 | 3 | 6 | 9 |12 | 15 | <- Floor Heights
| |___|___|___|___| |
|_______________| |____________|
sector A sector B Diagram 2-4
Voila! You now have a staircase! The reason we distributed the ceiling heights
also is because sector A has (in this example) a ceiling height of 16, and
sector B a ceiling height of 31. If we didn't distribute the ceiling heights,
then their wouldn't be enough room between the floor and ceiling on some
of the stairs for the player to stand. Here's a side view picture of the
above diagram in case your confused:
31
28 _________________
25 _____| |
22 _____| | Sector B |
19 _____| | | |
ceiling 16 _____| | | |_________________|
_________________| | | |_____|
| | | |_____| 15
| Sector A | |_____| 12
| |_____| 9
|_________________| 6
floor 0 3 Diagram 2-5
If the ceiling heights of sector A and sector B were both 31, then there
would be no need to distribute the ceiling heights, just the floor heights,
so you would use <Alt + F8>.
=================
Object Altitudes
=================
Now that you know about floor and ceiling altitudes, I'll tell you about
this. Say you wanted to put an object (like a storm trooper) in sector B
in the above level. You would copy a storm trooper from sector A...but
then the storm trooper would still be at height 0, and in a sector with
floor height 15 (like sector B), the storm trooper would be underground!
The way to fix this is to change the "Y" (up and down) coordinate of the
storm trooper. If you edit the storm trooper and change "Y" to 15, then
the storm trooper will be on the floor of sector B, just like he's supposed
to be, and ready to fry any rebel scum that enters the area.
It is REALLY easy to forget to change the Y coordinate when placing objects
in your level, so if you're testing out your level and some objects you
placed are not there, its probably because you forgot to change the Y
coordinate, so the objects are either underground or up in the air.
While I'm on the subject, I ought to mention that if you want to put an
object on the ceiling (like a hanging chain or something), then you
have to change the "Y" of the object to the same number as the ceiling height.
DFUSE does not automatically place ceiling objects on the ceiling, so you have
to do it yourself.
==========================
Textures - An Explination
==========================
Before we get into learning INF files, you gotta learn what Top, Middle,
and Bottom textures are so you know where to put your textures. Here's a
diagram showing a small alcove built into a wall. In the alcove, the floor
altitude (FAl) is 4 and the ceiling altitude (CAl) is 12. The sector next to
the alcove has a floor altitude of 0 and a ceiling altitude of 16.
Note that the following diagram is not a top view, but a first person
perspective:
wall 1 wall 2 wall 3
__________________________________
| | Top Tex. | |
| | | |
| | CAl = 12 | |
| |___________| | Diagram 2-6
| Mid | | Mid |
| Texture | (Alcove) | Texture |
| | | |
| |___________| |
| | FAL = 4 | |
| | | |
| | Bot Tex. | |
|_________|___________|__________|
The diagram below is a top view of the sector and the alcove in diagram 2-6.
By looking at this diagram, it might be a little easier to understand
diagram 2-6.
_______________________
| |
| wall 1 -> |
| |----------
| Normal | Alcove | Diagram 2-7
| Sector wall 2 -> | |
| | FAl: 4 |
| | CAl: 12 |
| FAl: 0 |----------
| CAl: 16 wall 3 -> |
|_____________________|
All this may sound confusing, but take a little time and try to under-
stand it. If you still don't get it, you can look at it later after you're
more experienced with DFUSE and DF.
============================================================================
Ok, now its time to get into what everyone has been waiting for! Go grab a
soda and get prepared for.... THE .INF FILE!!!!!!
Many people have never even tried to make a DF level because they heard that
you have to PROGRAM, a word which frightens some people. But trust me, folks,
you don't really have to be a programmer to understand the .inf file. It's
a pretty simple programming language. You don't even have to memorize
anything, because it will all be here in the tutorials. And even if you
don't understand how the programming language works, you can still make .inf
stuff by copying it from the tutorial.
The .INF file is used to make switches, elevators, conveyor belts, moving
sectors (also known as 'morphing' sectors), key doors, and stuff like that.
In this tutorial we will be introducing the .inf file to you, and we'll even
show you how to make some stuff, like lifts and swithces.
Be sure to check out the .INF file in our EXAMPLE1 level included with this
tutorial!
===========================
.INF File - An Introduction
===========================
Here's the basic structure of the .INF file (our comments are in []):
INF 1.0 [Version number, this will always be the same]
LEVELNAME SECBASE [The name of the level the .inf is for]
items 1 [The number of items in the .inf file. Must be updated when you
add more items!!!]
item: [sector or line] name: [the name of the sector] num: [used for lines only!]
seq [the start of the sequence]
class: elevator move_floor [class of the sector/line (see list)]
stop: 1 hold [stops are the main part of the sequence, more
stop: 2 hold on these later]
speed: 0 [speed of the sector]
seqend [the end of the sequence]
None of that probably makes sense to you right now, but you'll understand, so
just be patient.
Here is a list of the CLASSes and what each one means:
**NOTE*** In the inf file, the word 'elevator' does NOT mean an elevator that
moves up and down, like you would think. EVERY class starts with
the word 'elevator', so just don't pay attention to it.
INF SECTOR CLASSES
elevator basic
elevator change_light [changes the light level of the sector (Amb)
used for making the lights flash on & off]
elevator change_wall_light [changes the light level of a wall (Lig)]
elevator door [a normal door]
elevator door_mid [a door that has two parts, the top part goes
up and the bottom part goes down when you
open the door]
elevator inv [Not sure what this one is...anybody know?]
elevator morph_move1 [moving sector, but player will not move with sector]
elevator morph_move2 [moving sector, but player WILL move with sector]
elevator morph_spin1 [spinning sector, player doesn't move with sector]
elevator morph_spin2 [spinning sector, player DOES move with sector]
elevator move_ceiling [lowers or raises ceiling]
elevator move_fc [moves both ceiling and floor (must use @ stops!)]
elevator move_floor [lowers or raises floor]
elevator rotate_wall
elevator scroll_ceiling [scrolls the ceiling texture]
elevator scroll_floor [scrolls the floor texture (you move with it -
conveyour belts, water etc.)
elevator scroll_wall [scrolls the wall texture]
elevator teleporter chute [teleports player to another layer]
The list above is a list of ALL the .inf sector classes. The only ones we'll
use in this tutorial are elevator move_floor and elevator move_ceiling.
===============
Making an Lift
===============
I think the best way to explain how the .inf works is to show you how
to make a lift, so here goes...
This is what I'll be showing you how to make:
'lift'
________________ \/ ______________
| | | |
| |____| |
| 'start_point' | | 'end_point' | Diagram 2-8
| |____| |
| | | |
|________________| |______________|
FAl: 0 /\ FAl: 16
CAl: 16 FAl: 0 CAl: 32
CAl: 32
The lift in the middle of the 2 sectors will start at 0 floor height, and when
you step on it, it will bring the player up to floor height 16, and the player
will then be able to walk into sector 'end_point'.
After you have constructed and named these sectors, you will have to edit the
.inf file to make the sector 'lift' act like a lift. Pushing "I" in LEVMAP
will edit the .inf file, but for me it usually says "out of memory", so
you can also edit the .inf file by exiting LEVMAP and pushing "I". If this
is a new level, the .inf will have only one item in it, and the "items" line
should read "items 1". To make the lift we will have to add another item,
so change "items 1" to "items 2". If you don't update the "items" line every time
you make a new item it will cause problems, so in the future make sure
you remember to UPDATE THE NUMBER OF ITEMS!!!!
Here is what you would add (right under the first item) to the .inf to make
sector 'lift' do what we want:
item: sector name: lift
seq
class: elevator move_floor
event_mask: 52
stop: 0 hold
stop: 16 hold
speed: 10
seqend
Now I'll give you a line by line explaination of this so you'll understand
what it means:
"item: sector"
Since 'lift' is a sector, we would put item: sector. Switches, for example,
would use item: line because a switch is a line, not a sector.
"name: lift"
The name of the sector we want to affect. The name of the sector is 'lift',
so we put name: lift.
"seq"
This marks the start of the sequence of commands we will give to 'lift'.
"class: elevator move_floor"
This tells DF that the commands we give to 'lift' will be to make the floor
move. For a list of classes, see INF SECTOR CLASSES above.
"event_mask: 52"
The event_mask tells DF how the sector/line will be activated. Here is the
list of event_mask values:
EVENT_MASK VALUES:
1 WALK FROM INSIDE (line trigger)
2 WALK FROM OUTSIDE (line trigger)
4 ENTER SECTOR (sector trigger)
8 LEAVE SECTOR (sector trigger)
16 NUDGE FROM INSIDE (sector / line)
32 NUDGE FROM OUTSIDE (sector / line)
256 FIRE (shoot) (line trigger with entity_mask: *)
In this case, we are using "event_mask: 52. This means that our lift will
be activated in three different ways:
1. When the player enters (steps on) the sector (4)
2. When the player pushes the spacebar (nudge) when inside the sector (16)
3. When the player nudges the sector from outside of the sector (32)
The reason we put "event_mask: 52" is because 4 + 16 + 32 = 52.
"stop: 0 hold"
Stops are what are used to command the sector/line. This stop tells sector
'lift' to go to the floor height (because we're using elevator move_floor)
of 0 and hold there until the sector is activated.
"stop: 16 hold"
This stop tells the lift to move up to floor height 16, and hold there until
activated.
"speed: 10"
This tells 'lift' to move up and down at speed 10. A higher number would
make the lift move faster, a lower number slower.
"seqend"
This marks the end of the sequence of commands.
And that's all there is to it! Now save the .inf file and go back into
LEVMAP. The sector 'lift' should now be yellow if you did the .inf correctly.
When you highlight the sector 'lift' it should say "elevator move_floor".
Try out the lift and see how it works!!!
If you try out the lift you will probably notice that it doesn't 'move'
like the lifts in LA's levels. To fix this problem all you have to do
is anchor all the textures by setting the flag 'anchor wall texture' on the
lines that make up the lift. Remember, whenever you want to make something
move up or down, you have to anchor the textures.
==================
Making a Switch
==================
To show you how to make a switch, we'll make a switch that activates the
lift from the above section "Making a Lift" (diagram 2-8).
Before we do anything in the .inf, we have to put the switch on a wall.
Highlight any of the lines (except the line that's part of the lift) in
sector 'start_point'. Push enter, highlight "SGN:", and push enter again.
This will let you add a "sign" to the wall. What this will do is 'paste'
the texture you select (usually a switch or poster texture) on the wall
texture. Note that this is much better than Doom, where only certain wall
textures had buttons on them, because now you can put any switch on any
wall texture. Ok, now pick a switch texture (like ZASWIT12) and you'll be
all set. Oh, make sure you look at what line # the switch is on. It will
tell you that in the blue box in the left hand cornor of the screen where
it says "REL: # of 6". Remember the first #, as we will need it for the .inf
file.
*Note* You must have a switch texture on the wall for the switch to work!
Ok, save your level and now we're ready to add another item to the .inf.
Here's the item you would add to make the switch (don't forget to update
the "items" line!!!!):
item: line name: start_point num: (whatever number your line is)
seq
class: trigger switch1
event_mask: 16
client: lift
seqend
And of course here's our line by line description:
"item: line"
You use line here because the switch is on a line.
"name: start_point"
This is the name of sector that the line is in.
"num:"
This is the number of the line. You can find out what number a line is by
looking at the left blue box where it says "REL: # of #" in line mode. The
first number is the one you'd use.
"seq"
This marks the start of the sequence of commands.
"class: trigger switch1"
This is the class you use for a normal switch. Here is the list of the
other line classes:
INF LINE CLASSES
trigger
trigger single [a trigger used once]
trigger switch1 [used for making switches]
trigger standard [standard trigger]
trigger toggle [used for switches that toggle on and off]
"event_mask: 16"
makes the switch activate when you push (nudge) it.
"client: lift"
This tells the switch what sector it will trigger. Putting "client: lift"
makes the switch so that when you push it sector 'lift' will go to it's
next stop.
"seqend"
The end of the sequence.
We still aren't done making the switch. Now we have to edit the item in the
.inf that makes the lift and add some stuff to it (obviously you don't type
in "*****NEW LINE*****" after the new lines):
item: sector name: lift
seq
class: elevator move_floor
event_mask: 52
stop: 0 0 ********NEW LINE***********
stop: 0 hold
message: 1 start_point(#) done ********NEW LINE*******
stop: 16 hold
message: 2 start_point(#) done ******NEW LINE********
speed: 10
seqend
Here is an explaination of the new lines we added in:
"stop: 0 0"
This line doesn't do anything, but we put it here because for some reason
you can't send messages from stop 0. Remember this!!!! I'll say it again...
YOU CANNOT SEND MESSAGES FROM STOP 0!!!!!
"message: 1 start_point(#) done"
Messages are sent from stops, and they are sent when the sector ARRIVES at
the stop. The "1" means that the message is being sent from stop 1,
"start_point" is what sector that the line we want to send the message to is
in, "(#)" is the number of the line you want to send the message to (since
we are sending the message to a line). Make sure you fill in the "()" with
the correct number! "done" is the actual message we are sending -- it tells
the switch that the lift is done which makes the switch ready to be pressed
again.
"message: 2 start_point(#) done"
This is the same as the other message, except that this one is being sent
form stop 2, thus the "2". If we didn't put these messages in, then
after you pushed the switch once, it wouldn't let you press it again because
it would think that the lift was not done yet.
And that's all! You now have made a switch that activates the lift. Go
back into LEVMAP, and you'll see that the line you made a switch is now
light blue and it says "TRIG: switch1 client: lift".
However, the sign texture of the switch is on the bottom of the wall, so we'll
want to move it up a little so you don't have to duck down to press it.
To do this, change the "Y:" of the sign texture to "-4". A negative number
moves it up, and a positive number moves it down, so we moved it up 4. This
should put the switch at a height were the player would be able to
press it. Now load up DF and try it out!
===========
Key Doors
===========
Many people have e-mailed us asking how to make doors that open with keys,
so here you go!
To make a key door, you have to manually make a door in the .inf instead
of setting the "door" flag. DO NOT set the "door" flag on the key door or
it will not work properly!
*NOTE* The following is for key doors ONLY. If you want to make a regular
door all you have to do is set the "door" flag (See Part 1 of the tutorial).
Here's the situation: You want to make a red key door between 2 sectors
like this:
____________ ___________
| | | |
| FAl: 0 |_____| FAl: 0 |
| CAl: 16 | | CAl: 16 | Diagram 2-9
| |_____| |
| | | |
|____________| |___________|
/\
'red_door'
FAl: 0
CAl: 0
The Ceiling Altitude of 'red_door' would be 0 because we want the door to
start out closed (on the ground). To make the door open, we will move
the ceiling up. Remember, You do not have to do this if you are making a
regular door with the "door" flag.
Here's what you'd put in the .inf:
item: sector name: red_door
seq
class: elevator move_ceiling
event_mask: 32
speed: 30
key: red
stop: 0 hold
stop: 16 5
seqend
Here's a description of the lines you might not understand:
"class: elevator move_ceiling"
We use this class becuse we want to move the ceiling up and down, thus
simulating a door.
"event_mask: 32"
This make the door activate when you push on it.
"key: red"
This line is what makes the door need a red key. Putting "key: blue" would
make it need a blue key, and so on.
"stop: 0 hold "
Makes the door hold until pressed on.
"stop: 16 5"
This makes the ceiling height go up to 16 (opening the door), pause
for 5 seconds, then go to the next stop which makes it go back down to
the floor (closing the door) and hold there until pressed again.
There you go! Just make sure you don't forget to put a red key in the room!
========
Layers
========
If you've edited any of LucasArt's levels, you will see that some of the level
is gray instead of green. This is because some of the sectors are on different
layers. You can cycle up through the layers using Page Up, and down using Page
Down. When you make a new level, the starting sectors are on layer 0. To
change what layer a sector is on, simply edit the sector and change "LAY:".
Changing it to 1 would put the sector on the layer above 0, and -1 would be
below.
=====================
2 Ways to Test Levels
=====================
There are 2 different ways to test your level. I will tell you about them
both, and you can pick the one you like best.
1. Make it a .GOB ---- This is probably the most popular method of testing
a level. To do this push "T" (Test Level) from the
DFUSE menu. This will copy your level files, plus
all the files you have in the textures, sounds,
and graphics directories, and put them all in a .GOB
files called TESTLEVL.GOB on the c:\dark directory.
It will then load the .GOB and you can test out your
level. When your done making your level, all you have
to do is rename TESTLEVL.GOB whatever you want to and
distribute it. The advantage to this method is that
you can still play the LA level that your level
replaces because your level is in a .GOB.
2. Copy the Files ---- This is the way I told you how to test your level in
the last tutorial: Just copy the 6 files that make up
your level to the c:\dark directory. You can also make
DFUSE do this for you instead of putting your level in
a .GOB by editing the DFUSE.INI file. The advantage to
this method is that it won't copy unwanted graphics
or sound from the other directories like the above
method. The disadvantage is that say your level
replaces secbase and you copy the files to c:\dark -
you won't be able to play LA's secbase level unless
you delete yours.
===============
Helpful Hints
===============
Here's some helpful hints for using DFUSE:
* If it takes to long to load up your level, I suggest you edit the DFUSE.INI
file and turn "Object Layering" off. This will cut down the load time of
your level in half! (but you won't be able to tell what layer objects are
on)
* If your level crashes when you try to load it, chances are very good that
there is something wrong with the player start object. Make sure it exists,
that its inside a sector, and that its not above the ceiling or below
the floor.
* Pushing <Alt + S> will turn "shadowing" off - that is, it will not show
other layers in gray, but it will only show the current layer in green.
This is useful if you are editing LucasArt's levels or if your level is
really large.
* If you want to learn how to do something that isn't in the tutorials, I
suggest you edit LA's levels and see how they do it. That's how we learned!
Well, that's all for this tutorial! Don't worry, though, Part 3 will be
coming....
Part 3 of our tutorial will have LOTS more .inf stuff! E-mail us and tell
us what you'd like to see in Part 3.
FEEDBACK !!!!! ----
That is one thing we need LOTS of! In order to be able to improve our
tutorials and make them what you want them to be, you NEED TO TELL US WHAT
YOU THINK!!! PLEASE send us e-mail with any questions, comments, complaints,
etc. you have. If you don't understand something in this tutorial, you can
e-mail us and we'll try to help. Here's our E-Mail addresses:
On Compuserve: 74454,1421
From the Internet or any other On-Line service: 74454.1421@compuserve.com
Don't Forget to send us FEEDBACK! See you next tutorial!
Ben & Pat McBride
*=== COMING SOON ====*
Look for our Rebel Base Invasion level, coming soon to a forum / ftp site
near you!
P.S. If you are on any other online services (besides Compuserve), please
upload this file there so it can be widely distributed. Thanks.